■ オルタネートスイッチによるLEDの点灯、消灯
![]()
最初の入力検出としてはオルタネートスイッチを使った回路がよいと思います。オルタネートスイッチでLEDを点灯、
消灯させる回路を以下に示します。
モーメンタリースイッチを使ってLEDを確実に点灯、消灯させるのはチャタリングがあるので結構難しいものになります。
■ PICの入力ポートの入力検出方法の習得 <CCS編> <C18編> <C30 dsPIC編> <C30 PIC24編> <HI-TECH編>
<試作品仕様>
・ 電源(+5V)を入れたあと、オルタネートスイッチをONすると、LEDが点灯すること
逆にOFFするとLEDが消灯すること
CCSコンパイラの場合の例を以下に示します。
<試作品回路図>
PIC16F84をつかった場合の回路図を以下に示します。(→回路図のPDFファイル)

<試作品外観>

<プログラム例>
#include <16f84a.h> // PIC16F84のヘッダーファイル読込み
#use delay(clock=10000000) // 外部発振周波数を10MHzに設定
main()
{
while(1)
{
if(input(PIN_B3) == 0)output_low(PIN_A2); // RA2ビットへの出力LOW(0V)命令 → LED 点灯
else output_high(PIN_A2); // RA2ポートへの出力High(5V)命令 → LED 消灯
}
return 0; // int main()なので 戻り値がないとコンパイラの警告がでる
}
(2) C18編
C18コンパイラの例を以下に示します
<試作品回路図>(→回路図のPDFファイル)
PIC18F4550をつかった場合の回路図を以下に示します。

<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています

<プログラム例>
/*
オルタネートSWによる
LED ON/OFF
*/
#include <p18f4550.h>
#pragma config PLLDIV = 5 //96MHz PLL Prescalar(1、2、3、4、5、6、10、12のみ) : 外部周波数÷4MHz
//20MHz ÷ 5 = 4MHz → 96MHz(=4MHz×24 :固定)
#pragma config USBDIV = 2 // Full Speed USB Clock Source Selection : 2(constant)
#pragma config CPUDIV = OSC1_PLL2 //CPU System Clock Postscaler
// PICのUSB制御用クロック周波数:48MHz(=96MHz ÷2)
#pragma config FOSC = HS // システムクロック=20MHz
//#pragma config FOSC = HSPLL_HS // システムクロック=48MHz
#pragma config WDT = OFF //ウォッチドックタイマ OFF
#pragma config LVP = OFF //Low Voltage Program OFF
void main (void)
{
TRISB = 0x00;// B portを出力モードに設定
TRISC = 0b00000010;// C portのRC1を入力モードに設定
while (1) //入力信号をチェックし続ける
{
if(PORTCbits.RC1 == 0)LATBbits.LATB2 = 0; // CポートのRCビットが0なら BポートのRB2ビットを0にする → LED点灯
else LATBbits.LATB2 = 1; //LED消灯
}
}
XC8コンパイラによる PIC18 の例を以下に示します
<試作品回路図>(→回路図のPDFファイル)

<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています

<プログラム例>
#include <p18f14K50.h>
#include <xc.h>
long int Clock = 48; //12MHz x 4(PLL) = 48MHz
long Count_delay;
#define _XTAL_FREQ 48000000
#pragma config CPUDIV = NOCLKDIV ,USBDIV = OFF,PCLKEN = ON
#pragma config FOSC = HS,PLLEN = ON, HFOFST = OFF //PLL ON Periferal= 12MHz x 4 = 48MHz
#pragma config PWRTEN = ON, BOREN = OFF, MCLRE = OFF, BORV = 30
#pragma config WDTEN = OFF,LVP = OFF,FCMEN = OFF, IESO = OFF
#pragma config CP0 = OFF,XINST = OFF
#pragma config STVREN = OFF, BBSIZ = OFF,CPB = OFF,CP1 = OFF,CPD = OFF //省略するとwarnig がでる
#pragma config WRT0 = OFF,WRT1 = OFF,WRTC = OFF,WRTB = OFF,EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF //省略するとwarnig がでる
int main()
{
ANSEL = 0x00; // デジタルに設定
TRISC = 0b00100000; //RC5: in
LATCbits.LATC0 = 0; //Led RC0 : OFF
LATCbits.LATC1 = 0;
LATCbits.LATC2 = 0;
LATCbits.LATC3 = 0;
while(1)
{
if(PORTCbits.RC5 == 0) //SW ONの場合
{
LATCbits.LATC0 = 1; //Led RC0 : ON
LATCbits.LATC1 = 1;
LATCbits.LATC2 = 1;
LATCbits.LATC3 = 1;
}
else
{
LATCbits.LATC0 = 0; //Led RC0 : OFF
LATCbits.LATC1 = 0;
LATCbits.LATC2 = 0;
LATCbits.LATC3 = 0;
}
}
return 0;
}
(3) C30 dsPIC編
C30コンパイラによる dsPIC の例を以下に示します
<試作品回路図>(→回路図のPDFファイル)
dsPIC30F2012をつかった場合の回路図を以下に示します。

<試作品外観>PICへの書き込みはICSPでおこなっています。ICSP用のコネクタは写真には写っていません。

<プログラム例>
///************************************************************/
// LEDの オルタネートスチッチによるON/OFF
//************************************************************/
#include "p30f2012.h"
#define Clock 117920000 // 単位はHzで指定
_FOSC(CSW_FSCM_OFF & // クロック切り替えなし、フェースセイフクロックモニタなし
FRC_PLL16 //内臓高速RC発振器(7.37MHz)、PLL:16倍 → システムクロック周波数=7.37×16=117.92MHz
);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & //ブラウンアウトリセット機能:ON
BORV_42 & //ブラウンアウト電圧:4.2V
PWRT_64 & //パワーオンリセットタイマ64msec
MCLR_EN //MCLR機能:ON
);
_FGS(CODE_PROT_OFF); //コードプロテクト:OFF
/// メイン関数
int main(void)
{
TRISC = 0X0000; //Cポートを出力モードに設定
TRISD = 0xFFFF; //Dポートを入力モードに設定
while(1)
{
if(PORTDbits.RD8 == 1)LATCbits.LATC13 = 1; // SW ON(RUN側)の場合
// LED2(緑LED)→OFF LED1(赤LED)→ON
else LATCbits.LATC13 = 0; // SW OFF(LOAD側)の場合
// LED2(緑LED)→ON LED1(赤LED)→ OFF
}
return 0;
}
(4) C30 PIC24編
C30コンパイラ PIC24FJ64GA002の例を紹介します。
<試作品回路図>(→回路図のPDFファイル)

<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています

<プログラム例>
///************************************************************/
// LEDの オルタネートスチッチによるON/OFF
//************************************************************/
#include "p24FJ64GA002.h"
#define Clock 32000000 // 単位はHzで指定
/// コンフィギュレーション ビットの設定
_CONFIG1( JTAGEN_OFF & //JTAGポート: OFF
GCP_OFF & //コードプロテクト: OFF
GWRP_OFF & //書き込みプロテクト: OFF
BKBUG_OFF & //バックグランドデバック: OFF
COE_OFF & //クリップオン エミュレーション: OFF
ICS_PGx1& //ICDピンの選択: EMUC/EMUDをPGC1/PGD1と共用
FWDTEN_OFF )//ウォッチドックタイマ: OFF
_CONFIG2( IESO_OFF & // 2速度スタートアップ機能:OFF
FNOSC_FRCPLL & //内臓高速RC発振(8MHZ)回路 + 4倍PLL → 32MHz(= 8MHz × 4)
FCKSM_CSDCMD & //クロック切替え制御:OFF クロックモニタ:OFF
OSCIOFNC_OFF & //OSCO/RC15 function: OSCO or Fosc/2
IOL1WAY_OFF & //RP Register Protection: Unlimited Writes To RP Registers
I2C1SEL_PRI & //I2C1 pins Select: Use Primary I2C1 pins
POSCMOD_NONE) //発振回路モード Oscillator Selection: Primary disabled
/// メイン関数
int main(void)
{
AD1PCFG = 0xFFFF; //AD1PCFGレジスタ: Aポートをアナログで使用するかデジタルで使用するかの設定レジスタ
//全ポートデジタルポートに指定(デフォルトはアナログ故デジタルで使用するときは必須)
TRISA = 0xFFFF; //Aポートを入力モードに設定
TRISB = 0x0000; //Bポートを出力モードに設定
while(1)
{
if(PORTAbits.RA0 == 1)LATBbits.LATB15 = 1; // AポートのRA0がOFFなら BポートのRB15 OFF:
// LED → OFF
else LATBbits.LATB15 = 0; // LED → ON
}
return 0;
}
(5) PIC32MX編
PIC32MX460F512 C32コンパイラの場合の例を紹介します。
<試作品回路図>(→回路図のPDFファイル)

<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています

<プログラム例>
// PIC32MX460F512L SWによる LED ON/OFF
//
#include <proc/p32mx460f512l.h> //PIC32MX460F512L
#include <plib.h> // PIC32 peripheral library
//for SYSTEMConfigPerformance()
// コンフィギュレーション設定
// CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off
#pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2
#pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1
#pragma config FWDTEN=OFF, ICESEL=ICS_PGx2
int Clock = 80000000; //80MHz
int main(void)
{
SYSTEMConfigPerformance(80000000); // システム最適化
DDPCONbits.JTAGEN = 0; //I/OポートとしてRA0、RA1、RA4、RA5をつかう場合、電源投入後DDPCONレジスタのbit3を0に、設定する必要があり;ます。
//From the data sheet
//"JTAG program/debug port is multiplexed with port pins RA0, RA1, RA4 and RA5 on 100-pin devices.
// At power-on-reset, these pins are controlled by the JTAG port. To use these pins for general purpose I/O,
// the user’s application code must clear JTAGEN (DDPCON<3>) bit = 0. To use these pins for JTAG program/debug,
// the user’s application code must maintain JTAGEN bit = 1."
TRISAbits.TRISA4 = 0; //Aポートbit4を出力モードに設定
TRISAbits.TRISA5 = 0;
TRISAbits.TRISA6 = 0;
TRISAbits.TRISA7 = 0;
TRISEbits.TRISE8 = 1;//Eポートbit8を入力モードに設定
while(1)
{
if(PORTEbits.RE8 == 0) //SW1=ON
{
LATAbits.LATA4 = 1; // RA4 LED点灯
LATAbits.LATA5 = 1;
LATAbits.LATA6 = 1;
LATAbits.LATA7 = 1;
}
else //SW1=OFF
{
LATAbits.LATA4 = 0; // RA4 LED消灯
LATAbits.LATA5 = 0;
LATAbits.LATA6 = 0;
LATAbits.LATA7 = 0;
}
}
}
PIC16F1937の例を紹介します。
試作品回路図(→PDFファイル)

<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています

<プログラム例>
//HI-TEC LED SW ON_OFF
//Delay style Time 2sec: On Time 1sec,Off Time 1sec
// PIC16F1937
#include <htc.h>
#define _XTAL_FREQ 20000000 //Ceramic :20MHz
//Configuration
__CONFIG(
FOSC_HS & // EXTRC Oscillator, RC on RA7/OSC1/CLKIN
WDTE_OFF & // Power-up Timer Enable bit// PWRT disabled
PWRTE_ON & // MCLR Pin Function Select// RE3/MCLR/VPP pin function is MCLR
MCLRE_ON & // RE3/MCLR/VPP pin function is digital input
CP_OFF & // Program memory code protection is enabled
CPD_OFF & // Data memory code protection is enabled
BOREN_OFF & // Clock Out Enable bit// CLKOUT function is disabled. I/O or oscillator function on RA6/CLKOUT
CLKOUTEN_OFF & // CLKOUT function is enabled on RA6/CLKOUT pin
IESO_OFF & // Fail Clock Monitor Enable// Fail-Safe Clock Monitor is enabled
FCMEN_ON // Fail-Safe Clock Monitor is disabled
);
__CONFIG(
WRT_OFF & // 000h to 1FFh write protected, 200h to 1FFFh may be modified by EECON control
PLLEN_OFF & // 4x PLL disabled
STVREN_OFF &// Brown-out Reset Voltage selection// Brown-out Reset Voltage (VBOR) set to 1.9 V
BORV_19 & // Brown-out Reset Voltage (VBOR) set to 2.7 V
// DEBUG_OFF & // Background debugger is enabled
LVP_OFF // HV on MCLR/VPP must not be used for programming
);
void main()
{
TRISD = 0; //D port: outport
TRISC = 0xFF; // C port inport
while(1)
{
if(RC0 == 0) //SW : off
// if(PORTCbits.RC0 == 0) // これもOK
{
LATD0 = 1; //RD0 port LED off
LATD1 = 1; //RD1 port LED off
LATD2 = 1; //RD2 port LED off
LATD7 = 1; //RD7 port LED off
}
else // SW : on
{
LATD0 = 0; //RD0 port LED on
LATD1 = 0; //RD1 port LED on
LATD2 = 0; //RD2 port LED on
LATD7 = 0; //RD7 port LED on
}
}
}